www.gusucode.com > VC++ 汽配销售管理系统(Access)源码程序 > VC++ 汽配销售管理系统(Access)源码程序/源码/MyView.cpp

    //Download by http://www.NewXing.com
// htglxtView.cpp : implementation of the CHtglxtView class
//

#include "stdafx.h"
#include "qpglxt.h"

#include "MyDoc.h"
#include "MyView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CHtglxtView

IMPLEMENT_DYNCREATE(CMyView, CScrollView)

BEGIN_MESSAGE_MAP(CMyView, CScrollView)
	//{{AFX_MSG_MAP(CHtglxtView)
		// NOTE - the ClassWizard will add and remove mapping macros here.
		//    DO NOT EDIT what you see in these blocks of generated code!
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHtglxtView construction/destruction
CMyView::CMyView()
{
	// TODO: add construction code here
	m_pos.cx=0;
	m_pos.cy=0;
	PageRow[1]=0;

}	

CMyView::~CMyView()
{
	Deffont.DeleteObject();
}

BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	return CScrollView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CHtglxtView drawing

void CMyView::OnDraw(CDC* pDC)
{
	CMyDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	//逻辑设备大小
	LogicSize.cx=pDC->GetDeviceCaps(HORZRES);
	LogicSize.cy=pDC->GetDeviceCaps(VERTRES);
	//画主标题
	PrintMainCaption(pDC,false);
	//画副标题
	PrintDeckCaption(pDC,false);
	//画表头
	LVCOLUMN col;
	CString stext;
	int wid,xpos,ypos;
	xpos=30;
	ypos=m_pos.cy;
	pDC->Rectangle(30,ypos,LogicSize.cx-30,ypos+1);
	ypos=ypos+10;
	for(int i=0;i<m_ps.Grid->GetCols();i++)
	{
		col.mask=LVCF_TEXT;
		col.pszText=stext.GetBuffer(stext.GetLength());
		col.cchTextMax=255;
		m_ps.Grid->GetColumn(i,&col);
		wid=m_ps.Grid->GetColumnWidth(i);
		pDC->TextOut(xpos,ypos,col.pszText);
		xpos=xpos+wid;
	}
	ypos=ypos+ 20;//m_pos向下移动一个字的宽度
	pDC->Rectangle(30,ypos,LogicSize.cx-30,ypos+1);
	//画表格内容
	ypos=ypos+10;
	xpos=30;
	for(int r=0;r<m_ps.Grid->GetRows();r++)
	{
		for(int c=0;c<m_ps.Grid->GetCols();c++)
		{
			stext=m_ps.Grid->GetItemText(r,c);
			wid=m_ps.Grid->GetColumnWidth(c);
			pDC->TextOut(xpos,ypos,stext);
			xpos=xpos+wid;
		}
		xpos=30;
		ypos=ypos+20;
		m_pos.cx=30;
		m_pos.cy=ypos;
	}
	//打印合计信息
	pDC->Rectangle(30,ypos,LogicSize.cx-30,ypos+1);
	PrintTotal(pDC, false);
	// TODO: add draw code for native data here
}

void CMyView::OnInitialUpdate()
{
	CScrollView::OnInitialUpdate();
	CSize sizeTotal;
	// TODO: calculate the total size of this view
	CDC* pDC;
	pDC=this->GetDC();
	//逻辑设备大小
	LogicSize.cx=pDC->GetDeviceCaps(HORZRES);
	LogicSize.cy=pDC->GetDeviceCaps(VERTRES);
	sizeTotal.cx=100;
	GridWidth=0;
	for(int i=0;i<m_ps.Grid->GetCols();i++)
	{
		GridWidth=GridWidth+m_ps.Grid->GetColumnWidth(i);	
	}
	sizeTotal.cy=m_ps.Grid->GetRows()*24+200;
	sizeTotal.cx=GridWidth;
	SetScrollSizes(MM_TEXT, sizeTotal);
}

/////////////////////////////////////////////////////////////////////////////
// CHtglxtView printing

BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
	//宽度比率
	m_Info=pInfo;
	return DoPreparePrinting(pInfo);
}

void CMyView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	LPDEVMODE mode;
	mode=pInfo->m_pPD->GetDevMode();
	//打印纸大小
	PageSize.cx=mode->dmPaperLength;
	PageSize.cy=mode->dmPaperWidth;
	//逻辑设备大小
	LogicSize.cx=pDC->GetDeviceCaps(HORZRES);
	LogicSize.cy=pDC->GetDeviceCaps(VERTRES);
	//比率
	Ratio.x=(float)LogicSize.cx/(float)PageSize.cx;
	Ratio.y=(float)LogicSize.cy/(float)PageSize.cy;
	//打印页数
	pInfo->SetMaxPage(GridWidth*20*Ratio.x/LogicSize.cx-1);
	Deffont.CreatePointFont(280*Ratio.x,"宋体",NULL);
}

void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CHtglxtView diagnostics

#ifdef _DEBUG
void CMyView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CMyView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
	return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CHtglxtView message handlers

void CMyView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
{
	//逻辑设备大小
	LogicSize.cx=pDC->GetDeviceCaps(HORZRES);
	LogicSize.cy=pDC->GetDeviceCaps(VERTRES);
	//宽度比率
	WidthRatio=LogicSize.cx/GridWidth;
	//画边框
	pDC->Rectangle(10*Ratio.x,10*Ratio.y,LogicSize.cx-(10*Ratio.x),LogicSize.cy-(10*Ratio.y));
	if(pInfo->m_nCurPage==1)
	{
		//画主标题
		PrintMainCaption(pDC);
		//画副标题
		PrintDeckCaption(pDC);
		//画表头
		PrintGridHead(pDC);
		//画表格
		PrintGridCell(pDC,pInfo);
	}
	else
	{	
		//画表头
		PrintGridHead(pDC);
		PrintGridCell(pDC,pInfo);
	}
	PrintPage(pDC,pInfo);
	//CScrollView::OnPrint(pDC, pInfo);
}
void CMyView::PrintMainCaption(CDC *pDC,bool bRatio)
{	
	//是否自动根据分辨率调整位置
	RatioStruct rRatio;
	rRatio.x=0.5;
	rRatio.y=0.5;
	if(bRatio==true)
		rRatio=Ratio;
	//逻辑设备大小
	LogicSize.cx=pDC->GetDeviceCaps(HORZRES);
	LogicSize.cy=pDC->GetDeviceCaps(VERTRES);
	CFont Mainfont;
	Mainfont.CreatePointFont(m_ps.MainCaptionFontSize*rRatio.y,"黑体",NULL);
	pDC->SelectObject(&Mainfont);
	CRect rect(10*rRatio.x,10*rRatio.y,LogicSize.cx-(10*rRatio.x),m_ps.MainCaptionFontSize/4*rRatio.y+(10*rRatio.y));
	pDC->DrawText(m_ps.MainCaption,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
	m_pos.cy=m_ps.MainCaptionFontSize/4*rRatio.y+(10*rRatio.y);
	Mainfont.DeleteObject();
}

void CMyView::PrintDeckCaption(CDC* pDC,bool bRatio)
{
	//是否自动根据分辨率调整位置
	RatioStruct rRatio;
	rRatio.x=0.5;
	rRatio.y=0.5;
	if(bRatio==true)
		rRatio=Ratio;
	//逻辑设备大小
	LogicSize.cx=pDC->GetDeviceCaps(HORZRES);
	LogicSize.cy=pDC->GetDeviceCaps(VERTRES);
	CFont Deckfont;
	Deckfont.CreatePointFont(m_ps.DeckCaptionFontSize*rRatio.y,"宋体",NULL);
	pDC->SelectObject(&Deckfont);

	CRect rect;
	for(int i=0;i<m_ps.DeckCaptionNumber;i++)
	{
		m_pos.cy=m_pos.cy+(m_ps.DeckCaptionFontSize/5)*rRatio.y;
		pDC->TextOut(50*rRatio.x,m_pos.cy,m_ps.DeckCaptions[i]);
	}
	m_pos.cy=m_pos.cy+(m_ps.DeckCaptionFontSize/5)*rRatio.y;
	Deckfont.DeleteObject();
}

void CMyView::PrintGridHead(CDC *pDC,bool bRatio)
{
	//是否自动根据分辨率调整位置
	RatioStruct rRatio;
	rRatio.x=0.5;
	rRatio.y=0.5;
	if(bRatio==true)
		rRatio=Ratio;
	pDC->SelectObject(&Deffont);
	//逻辑设备大小
	LogicSize.cx=pDC->GetDeviceCaps(HORZRES);
	LogicSize.cy=pDC->GetDeviceCaps(VERTRES);

	//画线
	pDC->Rectangle(50*rRatio.x,m_pos.cy,LogicSize.cx-(50*rRatio.x),m_pos.cy+2*rRatio.y);
	//画表头
	LVCOLUMN col;
	CString stext;
	m_pos.cx=50*rRatio.x;
	int wid;
	m_pos.cy=m_pos.cy+10*rRatio.y;
	for(int i=0;i<m_ps.Grid->GetCols();i++)
	{
		col.mask=LVCF_TEXT;
		col.pszText=stext.GetBuffer(stext.GetLength());
		col.cchTextMax=255;
		m_ps.Grid->GetColumn(i,&col);
		wid=m_ps.Grid->GetColumnWidth(i)*WidthRatio;
		pDC->TextOut(m_pos.cx,m_pos.cy,col.pszText);
		m_pos.cx=m_pos.cx+wid;
	}
	m_pos.cy=m_pos.cy+38*rRatio.y;//m_pos向下移动一个字的宽度
	//画线
	pDC->Rectangle(50*rRatio.x,m_pos.cy,LogicSize.cx-(50*rRatio.x),m_pos.cy+2*rRatio.y);
	m_pos.cy=m_pos.cy+ 10*rRatio.y;////m_pos向下移动一条线的宽度
	Deffont.DeleteObject();
}	


void CMyView::PrintGridCell(CDC *pDC,CPrintInfo* pInfo,bool bRatio)
{
	//是否自动根据分辨率调整位置
	RatioStruct rRatio; 
	rRatio.x=0.5;
	rRatio.y=0.5;
	if(bRatio==true)
		rRatio=Ratio;	
	pDC->SelectObject(&Deffont);
	//逻辑设备大小
	LogicSize.cx=pDC->GetDeviceCaps(HORZRES);
	LogicSize.cy=pDC->GetDeviceCaps(VERTRES);
	//画表格	
	m_pos.cx=50*rRatio.x;
	int wid;
	CString stext;
	
	if(pInfo->m_nCurPage!=1)
	{
			m_pos.cx=50*rRatio.x;
			m_pos.cy=100*rRatio.y;
	}
	for(int r=PageRow[pInfo->m_nCurPage];r<m_ps.Grid->GetRows();r++)
	{
		for(int c=0;c<m_ps.Grid->GetCols();c++)
		{
			stext=m_ps.Grid->GetItemText(r,c);
			wid=m_ps.Grid->GetColumnWidth(c)*WidthRatio;
			pDC->TextOut(m_pos.cx,m_pos.cy,stext);
			m_pos.cx=m_pos.cx+wid;
		}
		m_pos.cx=50*rRatio.x;
		m_pos.cy=m_pos.cy+40*rRatio.y;//m_pos向下移动一个字的宽度
		if(m_pos.cy+(100*rRatio.y)>LogicSize.cy)
		{
			pDC->Rectangle(50*rRatio.x,m_pos.cy,LogicSize.cx-(50*rRatio.x),m_pos.cy+2*rRatio.y);
			PageRow[pInfo->m_nCurPage+1]=r+1;
			m_pos.cx=50*rRatio.x;
			m_pos.cy=40*rRatio.y;
			break;
		}
	}
	if(r==m_ps.Grid->GetRows())
	{	//画线
		pDC->Rectangle(	m_pos.cx,m_pos.cy,LogicSize.cx-(50*rRatio.x),m_pos.cy+2*rRatio.y);
		//画合计信息
		PrintTotal(pDC,bRatio);
	}
	m_pos.cx=50*rRatio.x;
	m_pos.cy=40*rRatio.y;
	Deffont.DeleteObject();
}

void CMyView::PrintPage(CDC *pDC,CPrintInfo* pInfo,bool bRatio)
{
	pDC->SelectObject(&Deffont);
	//是否自动根据分辨率调整位置
	RatioStruct rRatio; 
	rRatio.x=0.5;
	rRatio.y=0.5;
	if(bRatio==true)
		rRatio=Ratio;
		//逻辑设备大小
	LogicSize.cx=pDC->GetDeviceCaps(HORZRES);
	LogicSize.cy=pDC->GetDeviceCaps(VERTRES);
	CString stext;
	stext.Format("第%d页",pInfo->m_nCurPage);
	CRect rect(0,LogicSize.cy-(100*rRatio.x),LogicSize.cx,LogicSize.cy);
	pDC->DrawText(stext,&rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
	Deffont.DeleteObject();
}

void CMyView::PrintTotal(CDC *pDC, bool bRatio)
{
	//是否自动根据分辨率调整位置
	RatioStruct rRatio;
	rRatio.x=0.5;
	rRatio.y=0.5;
	if(bRatio==true)
		rRatio=Ratio;
	//逻辑设备大小
	LogicSize.cx=pDC->GetDeviceCaps(HORZRES);
	LogicSize.cy=pDC->GetDeviceCaps(VERTRES);
	CFont Deckfont;
	Deckfont.CreatePointFont(m_ps.DeckCaptionFontSize*rRatio.y,"宋体",NULL);
	pDC->SelectObject(&Deckfont);

	CRect rect;

	if(m_ps.TotalNumber%2!=0)
		m_ps.TotalNumber=m_ps.TotalNumber+1;
	for(int i=0;i<m_ps.TotalNumber;i=i+2)
	{
		m_pos.cy=m_pos.cy+(m_ps.DeckCaptionFontSize/5)*rRatio.y;
		pDC->TextOut(50*rRatio.x,m_pos.cy,m_ps.Totals[i]);
		pDC->TextOut(LogicSize.cx/2,m_pos.cy,m_ps.Totals[i+1]);
	}
	m_pos.cy=m_pos.cy+(m_ps.DeckCaptionFontSize/5)*rRatio.y;
	Deckfont.DeleteObject();
}